package com.lizemin.custom.classloader.classloader;

import cn.hutool.core.io.FileUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;

/**
 * @author lzm
 * @date 2025/6/2 15:22
 * @description 自定义类加载器
 */
public class FileSystemClassloader extends ClassLoader {

    /**
     * 源码文件所在的目录
     */
    private String rootDir;

    /**
     * 每次使用一个新的 FileSystemClassloader，都会重新编译一次所有的java文件，用来实现热加载
     *
     * @param rootDir 文件系统上的类文件目录
     */
    public FileSystemClassloader(String rootDir) {
        // 编译目录中的所有java文件
        ComplierUtil.compile(rootDir);
        this.rootDir = rootDir;
    }

    @Override
    protected Class<?> findClass(String name) throws ClassNotFoundException {
        if (name == null || name.isEmpty()) {
            throw new ClassNotFoundException("类名不可为空");
        }
        int index = name.lastIndexOf(".");
        String className = name.substring(index + 1);
        String separator = File.separator;
        rootDir = rootDir.endsWith(separator) ? rootDir : rootDir + separator;
        String classFile = rootDir + className + ".class";
        try {
            byte[] classBytes = Files.readAllBytes(Paths.get(classFile));
            return  defineClass(name, classBytes, 0, classBytes.length);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

}
